/*******************************************************************************
 * Copyright (c) 2012 Alexandr Tsvetkov.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *     Alexandr Tsvetkov - initial API and implementation
 * 
 * Project:
 *     TAO Library
 * 
 * File name:
 *     StoreString.java
 *
 * License agreement:
 *
 * 1. This code is published AS IS. Author is not responsible for any damage that can be
 *    caused by any application that uses this code.
 * 2. Author does not give a garantee, that this code is error free.
 * 3. This code can be used in NON-COMMERCIAL applications AS IS without any special
 *    permission from author.
 * 4. This code can be modified without any special permission from author IF AND ONLY IF
 *    this license agreement will remain unchanged.
 * 5. SPECIAL PERMISSION for this code usage in COMMERCIAL application SHOULD be obtained
 *    from author.
 ******************************************************************************/
package ua.at.tsvetkov.data.stores;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.HashSet;

import ua.at.tsvetkov.util.Log;

/**
 * @author A.Tsvetkov 2011, http://tsvetkov.at.ua, al@ukr.net
 */
public class StoreString {

	public HashSet<String>	data;
	private String				storeFileName;
	private boolean			appendable;

	/**
	 * Создает хранилище данных в памяти и при необходимости сохраняет/восстанавливает в файле.
	 * 
	 * @param aClass название класса.
	 * @param storeFileName название файла для хранения данных.
	 */
	public StoreString(String storeFileName) {
		this.storeFileName = storeFileName;
		this.data = new HashSet<String>();
		appendable = false;

	}

	/**
	 * Устанавливает флаг записи данных - добавлять данные к существующим или перезаписывать файл.
	 * @param appendable
	 */
	public void setAppendable(boolean appendable) {
		this.appendable = appendable;
	}

	/**
	 * Является ли хранилище пополняемым файлом или данные перезаписываются.
	 * @return
	 */
	public boolean isAppendable() {
		return appendable;
	}

	/**
	 * Добавляет объект для хранения.
	 * 
	 * @param object объект для хранения.
	 */
	public void add(String st) {
		if (st != null) {
			data.add(st);
		} else {
			Log.e("String == null ");
		}
	}

	/**
	 * Проверяет наличие строки в данных
	 * 
	 * @param st
	 * @return
	 */
	public boolean isContains(String st) {
		for (String str : data) {
			if (str.equals(st)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Проверяет наличие подстроки в данных
	 * 
	 * @param st
	 * @return
	 */
	public boolean isContainsSubstring(String st) {
		for (String str : data) {
			if (str.contains(st)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Удаление объекта
	 * 
	 * @param object
	 */
	public void remove(String st) {
		for (String str : data) {
			if (str.equals(st)) {
				st = str;
				break;
			}
		}
		data.remove(st);
	}

	/**
	 * Удаление объекта с подстрокой
	 * 
	 * @param object
	 */
	public void removeWithSubstring(String st) {
		String forSearch = "";
		for (String str : data) {
			if (str.contains(st)) {
				forSearch = str;
				break;
			}
		}
		data.remove(forSearch);
	}
	
	/**
	 * Очистка массива данных
	 */
	public void clear() {
		data.clear();
	}

	/**
	 * Сохраняет данные в файл
	 */
	public void save() {
		BufferedWriter out = null;
		try {
			out = new BufferedWriter(new FileWriter(new File(storeFileName)));
			if (appendable) {
				for (String st : data) {
					out.append(st + "\n");
				}
			} else {
				for (String st : data) {
					out.write(st + "\n");
				}
			}
			out.flush();
			out.close();
			Log.v("Saved " + storeFileName);
		} catch (Exception e) {
			Log.e("Failed saving " + storeFileName, e);
		}
	}

	/**
	 * Загружает данные из файла
	 */
	public void load() {
		if (storeFileName == null || storeFileName.length() == 0) {
			return;
		}
		File file = new File(storeFileName);
		if (!file.exists()) {
			return;
		}
		BufferedReader in = null;
		try {
			in = new BufferedReader(new FileReader(new File(storeFileName)));
			while (in.ready()) {
				data.add(in.readLine());
			}
			in.close();
			Log.v("Loaded " + storeFileName);
		} catch (Exception e) {
			Log.e("Failed loading data from " + storeFileName, e);
		}
	}

}
